#include  "seg.h"
char  table[]={0x3,0x9f,0x25,0x0D,0x99,0x49,0x41,0x1f,0x1,0x09};
static void delay_1us()
{
	__nop();__nop();
	__nop();__nop();
	__nop();__nop();
	__nop();__nop();
	__nop();__nop();
	__nop();__nop();
	__nop();__nop();
	__nop();__nop();
	__nop();__nop();
	__nop();__nop();
	__nop();__nop();
	__nop();__nop();
	__nop();__nop();
	__nop();__nop();
	__nop();__nop();
}
static void send_byte(uint8_t port,uint8_t num)
{
	switch(port)
	{
		case 0:
			for(int i=0;i<8;i++)
			{
				if(num &0X01) HAL_GPIO_WritePin(DATA1_GPIO_Port,DATA1_Pin,GPIO_PIN_SET);
				else HAL_GPIO_WritePin(DATA1_GPIO_Port,DATA1_Pin,GPIO_PIN_RESET);
				__nop();__nop();
				HAL_GPIO_WritePin(SHCP1_GPIO_Port,SHCP1_Pin,GPIO_PIN_RESET);
				delay_1us();
				HAL_GPIO_WritePin(SHCP1_GPIO_Port,SHCP1_Pin,GPIO_PIN_SET); 
				num >>= 1;
			}
			break;
		case 1:
			for(int i=0;i<8;i++)
			{
				if(num &0X01) HAL_GPIO_WritePin(DATA_GPIO_Port,DATA_Pin,GPIO_PIN_SET);
				else HAL_GPIO_WritePin(DATA_GPIO_Port,DATA_Pin,GPIO_PIN_RESET);
				__nop();__nop();
				HAL_GPIO_WritePin(SHCP_GPIO_Port,SHCP_Pin,GPIO_PIN_RESET);
				delay_1us();
				HAL_GPIO_WritePin(SHCP_GPIO_Port,SHCP_Pin,GPIO_PIN_SET);
				num >>= 1;
			}
			HAL_GPIO_WritePin(STCP_GPIO_Port,STCP_Pin,GPIO_PIN_SET);
			delay_1us();
			HAL_GPIO_WritePin(STCP_GPIO_Port,STCP_Pin,GPIO_PIN_RESET);//set low
			break;
	}
}
void SegInit()
{
	//default all no lights.
}
void SegSetNumber(uint8_t segNum,uint8_t num,uint8_t point)
{
	num = table[num];
	if(point)
		num &= (~1);
	switch(segNum)
	{		
		case 0:
			HAL_GPIO_WritePin(SEG3_GPIO_Port,SEG3_Pin,GPIO_PIN_SET);
			HAL_GPIO_WritePin(SEG4_GPIO_Port,SEG4_Pin,GPIO_PIN_RESET);
			send_byte(1,num);
			HAL_GPIO_WritePin(STCP_GPIO_Port,STCP_Pin,GPIO_PIN_SET);
			delay_1us();
			HAL_GPIO_WritePin(STCP_GPIO_Port,STCP_Pin,GPIO_PIN_RESET);//set low
			break;	
		case 1:
			HAL_GPIO_WritePin(SEG3_GPIO_Port,SEG3_Pin,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(SEG4_GPIO_Port,SEG4_Pin,GPIO_PIN_SET);
			send_byte(1,num);
			HAL_GPIO_WritePin(STCP_GPIO_Port,STCP_Pin,GPIO_PIN_SET);
			delay_1us();
			HAL_GPIO_WritePin(STCP_GPIO_Port,STCP_Pin,GPIO_PIN_RESET);//set low
			break;
		case 2:
			HAL_GPIO_WritePin(SEG1_GPIO_Port,SEG1_Pin,GPIO_PIN_SET);
			HAL_GPIO_WritePin(SEG2_GPIO_Port,SEG2_Pin,GPIO_PIN_RESET);
			send_byte(0,num);
			HAL_GPIO_WritePin(STCP1_GPIO_Port,STCP1_Pin,GPIO_PIN_SET);
			delay_1us();
			HAL_GPIO_WritePin(STCP1_GPIO_Port,STCP1_Pin,GPIO_PIN_RESET);//set low
			break;
		case 3:	
			HAL_GPIO_WritePin(SEG1_GPIO_Port,SEG1_Pin,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(SEG2_GPIO_Port,SEG2_Pin,GPIO_PIN_SET);
			send_byte(0,num);
			HAL_GPIO_WritePin(STCP1_GPIO_Port,STCP1_Pin,GPIO_PIN_SET);
			delay_1us();
			HAL_GPIO_WritePin(STCP1_GPIO_Port,STCP1_Pin,GPIO_PIN_RESET);//set low
			break;
	}
}
void ShowNumber(float a1,float a2)
{
	SegSetNumber(0,(int)a1%10,1);
	HAL_Delay(1);
	SegSetNumber(1,(int)(a1*10)%10,0);
	HAL_Delay(1);
	SegSetNumber(2,(int)a2%10,1);
	HAL_Delay(1);
	SegSetNumber(3,(int)(a2*10)%10,0);
	HAL_Delay(1);
}
